Libraries

Load data

file_path_t <- "/Users/juliat/Desktop/bachelor/Final thesis/ccc_cellchat.t.2.rds"
cellchat.t <- readRDS(file_path_t)
file_path_s <- "/Users/juliat/Desktop/bachelor/Final thesis/ccc_cellchat.s.2.rds"
cellchat.s <- readRDS(file_path_s)

Creating dgCMatrix (to avoid turning all data into a matrix, we take ) and merge data

# tresh = 1 not to loose data, because it is not possible to compare 13008 and 12058 rows
cellchat.t.sC <- subsetCommunication(cellchat.t, thresh=1) 
cellchat.s.sC <- subsetCommunication(cellchat.s, thresh=1)

# Merge the two data frames
merged_data <- merge(cellchat.t.sC,
                     cellchat.s.sC, 
                     by = c("source", "target", "ligand", "receptor", 
                            "interaction_name","interaction_name_2", 
                            "pathway_name", "annotation", "evidence"),
                     all = TRUE)

Replace NA values with 0

merged_data <- merged_data %>%
  mutate(
    prob.t = ifelse(is.na(prob.x), 0, prob.x),
    prob.s = ifelse(is.na(prob.y), 0, prob.y),
    pval.t = ifelse(is.na(pval.x), 0, pval.x),
    pval.s = ifelse(is.na(pval.y), 0, pval.y)
  ) %>%
  select(-prob.x, -prob.y, -pval.x, -pval.y) # delete columns 

Calculating the difference between probabilities tumor - skin

merged_data <- merged_data %>%
  mutate(prob.delta = prob.t - prob.s) %>%
  arrange(desc(abs(prob.delta)))

Count interactions for skin and tumor (actual numeric difference )

cellchat.t.sC_counts <-
  cellchat.t.sC %>%
  group_by(source, target) %>%
  summarise(count_t = n())
## `summarise()` has grouped output by 'source'. You can override using the
## `.groups` argument.
cellchat.s.sC_counts <- 
  cellchat.s.sC %>% 
  summarise(.by = c(source, target), count_s = n())

# Merge counts
merged_df.interactions <- merge(
  cellchat.t.sC_counts,
  cellchat.s.sC_counts,
  .by = c("source", "target"),
  all = TRUE
)
# Replacing NA with 0 in case some interactions are not present in one of the data frames
merged_df.interactions[is.na(merged_df.interactions)] <- 0
# Calculate the difference in counts:
merged_df.interactions$interaction_difference <-
  merged_df.interactions$count_t - merged_df.interactions$count_s

Heatmap based on counts difference

heatmap_plot <-
  ggplot(merged_df.interactions,
         aes(x=target, y=source, fill=interaction_difference)) + 
  geom_tile(color = "white", size = 0.1) +
  scale_fill_gradient2(
    name = "Interactions Difference", 
    high = rgb(178/255, 24/255, 43/255), # Diverging color scale
    low = rgb(33/255, 102/255, 172/255)
  ) +
  labs(
    title = "Difference in Number of Interactions (Tumor vs Skin)",
    x = "Target cells (receptor)",
    y = "Source cells (ligand)",
    fill = "Interactions Difference"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1, size = 10),
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12),
    plot.title = element_text(size = 14, face = "bold"),
    legend.position = "right",
    legend.direction = "vertical",
    legend.title = element_text(size = 12),
    legend.text = element_text(size = 10)
  )
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
print(heatmap_plot)

ggsave("heatmap_based_on_counts_difference.png", 
       plot = heatmap_plot, 
       width = 10, 
       height = 8, 
       dpi = 300)

# Convert to plotly for interactivity
interactive_heatmap <- ggplotly(heatmap_plot)

# Print the interactive heatmap
interactive_heatmap
# Convert factors to characters to avoid conversion issues
merged_df.interactions$source <- as.character(merged_df.interactions$source)
merged_df.interactions$target <- as.character(merged_df.interactions$target)

# Create a new matrix with all zero values
interaction_matrix <- matrix(0, 
                             nrow = length(unique(merged_df.interactions$source)), 
                             ncol = length(unique(merged_df.interactions$target)),
                             dimnames = list(unique(merged_df.interactions$source),
                             unique(merged_df.interactions$target)))

# Fill the matrix with interaction_difference values
for(i in seq_len(nrow(merged_df.interactions))) {
  interaction_matrix[merged_df.interactions$source[i],
                     merged_df.interactions$target[i]] <- 
    merged_df.interactions$interaction_difference[i]
}

# Pheatmap
pheatmap_based_on_counts_difference <- pheatmap(
  interaction_matrix,
         color = colorRampPalette(
           c(rgb(33/255, 102/255, 172/255),
             "white",
             rgb(178/255, 24/255, 43/255)))(100),
  border_color = NA,
  treeheight_row = 50,
  treeheight_col = 50,
  legend = TRUE,
  main = "Difference in Number of Interactions (Tumor vs Skin)"
         )

print (pheatmap_based_on_counts_difference)

ggsave("pheatmap_based_on_counts_difference.png", 
       plot = pheatmap_based_on_counts_difference, 
       width = 10, 
       height = 8, 
       dpi = 300)

Bubble Plot

# netVisual_bubble(cellchat.t, sources.use = 8, targets.use = 8, thresh = 0.05) # Fibroblast_32 to Fibroblast_32
# netVisual_bubble(cellchat.t, sources.use = 9, targets.use = 9, thresh = 0.05) # Fibroblast_36 to Fibroblast_36
# netVisual_bubble(cellchat.t, sources.use = 8, targets.use = 2, thresh = 0.05) # Fibroblast_32 to Endothel
# netVisual_bubble(cellchat.t, sources.use = 3, targets.use = 8, thresh = 0.05) # Endothel_vasc._31 to Fibroblast_32 
# netVisual_bubble(cellchat.t, sources.use = 8, targets.use = 13, thresh = 0.05) # Fibroblast_32 to Monocyte
# netVisual_bubble(cellchat.t, sources.use = 6, targets.use = 2, thresh = 0.05) # Fibroblast_20 to Endothel

CELLCHAT tumor pathways

# cellchat.t@netP$pathways
# cellchat.t@meta$DE = factor(
#   cellchat.t@meta$DE, 
#   levels = c ("B cell", "Endothel", "Endothel_vasc._31", "Erythrocyte", 
#               "Fibroblast_18", "Fibroblast_20", "Fibroblast_25","Fibroblast_32",
#               "Fibroblast_36", "T gd", "Keratinocyte_26", "Mast_27", "Monocyte",
#               "Monocyte_23", "Neurons_47", "Neutrophil", "NK", "NK T like", 
#               "Plasma_15", "Plasma_35", "Plasma_37", "Platelet", "Schwann_43", 
#               "T cytotox. CD8", "T fh", "T mem 1", "T mem 2", "T naive CD4", 
#               "T reg CD4", "T undef.")
# )
# x <- "COLLAGEN"
# for(x in cellchat.t@netP$pathways){
#   p <- plotGeneExpression(
#     cellchat.t, 
#     signaling = x)
#   ggsave(
#     paste0(x, ".pdf"),
#     plot=p,
#     width=10,
#     height=10
#   )
# }

CELLCHAT skin pathways

# cellchat.s@netP$pathways
# cellchat.s@meta$DE = factor(
#   cellchat.s@meta$DE, 
#   levels = c ("B cell", "Endothel", "Endothel_vasc._31", "Erythrocyte", 
#               "Fibroblast_18", "Fibroblast_20", "Fibroblast_25","Fibroblast_32",
#               "Fibroblast_36", "T gd", "Keratinocyte_26", "Mast_27", "Monocyte",
#               "Monocyte_23", "Neurons_47", "Neutrophil", "NK", "NK T like", 
#               "Plasma_15", "Plasma_35", "Plasma_37", "Platelet", "Schwann_43",
#               "T cytotox. CD8", "T fh", "T mem 1", "T mem 2", "T naive CD4", 
#               "T reg CD4", "T undef.")
#   )
# y <- "COLLAGEN"
# for(y in cellchat.s@netP$pathways){
#   p <- plotGeneExpression(
#     cellchat.s, 
#     signaling = y)
#   ggsave(
#     paste0(y, ".pdf"),
#     plot=p, 
#     width=10, 
#     height=10
#     )
# }

Number of interactions per source cell (ligand) in tumor and skin

# Creating a tibble
df.t <- cellchat.t %>% 
  subsetCommunication(thresh = NA) %>% 
  as_tibble() 
df.s <- cellchat.s %>%
  subsetCommunication(thresh = NA) %>%
  as_tibble()

df.t <- cellchat.t %>%
  subsetCommunication(thresh = NA) %>% 
  dplyr::as_tibble() %>%
  dplyr::count(source) %>%
  dplyr::rename(Number_of_Interactions = n)

df.t$Type <- "Tumor"

df.s <- cellchat.s %>%
  subsetCommunication(thresh = NA) %>% 
  dplyr::as_tibble() %>% 
  dplyr::count(source) %>% 
  dplyr::rename(Number_of_Interactions = n)

# Making counts negative
df.s$Number_of_Interactions <- -df.s$Number_of_Interactions 
df.s$Type <- "Skin"

combined_data <- bind_rows(df.t, df.s)

# Plot tumor + skin
combined_plot <- ggplot(
  combined_data, 
  aes(
    x = source, 
    y = Number_of_Interactions, 
    fill = Type)
  ) +
  geom_bar(
    stat = "identity", 
    position = "stack") +
  labs(
    title = "Number of interactions per source cell", 
    y = "Number of Interactions", 
    x = "Source Cell") +
  scale_fill_manual(
    values = c(
      "Skin" = rgb(33/255, 102/255, 172/255), 
      "Tumor" = rgb(178/255, 24/255, 43/255))
    ) +
    theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 90, hjust = 1) 
    # hjust = 1 to "press" names to plot
  )
print(combined_plot)

ggsave("count_source_tumor_vs_skin.png", 
       plot = combined_plot, 
       width = 10, 
       height = 8, 
       dpi = 300)

There are no T naive CD4 in skin so lets exclude them from analysis

# Define the identifier for naive CD4 T cells
naive_CD4_identifier <- "T naive CD4"

# Filter out interactions involving naive CD4 T cells from the tumor dataset
cellchat.t.sC <- subsetCommunication(cellchat.t, thresh=1) %>%
                 filter(!(source == naive_CD4_identifier | 
                            target == naive_CD4_identifier))

# Filter out interactions involving naive CD4 T cells from the skin dataset
cellchat.s.sC <- subsetCommunication(cellchat.s, thresh=1) %>%
                 filter(!(source == naive_CD4_identifier | 
                            target == naive_CD4_identifier))

# merge the two data frames
merged_data <- merge(cellchat.t.sC, cellchat.s.sC, 
                     by = c("source", "target", "ligand", "receptor", 
                            "interaction_name","interaction_name_2", 
                            "pathway_name", "annotation", "evidence"),
                     all = TRUE)

Repeat all steps bellow but for data without T naive CD4 Replace NA values with 0

merged_data <- merged_data %>%
  mutate(
    prob.t = ifelse(is.na(prob.x), 0, prob.x),
    prob.s = ifelse(is.na(prob.y), 0, prob.y),
    pval.t = ifelse(is.na(pval.x), 0, pval.x),
    pval.s = ifelse(is.na(pval.y), 0, pval.y)
  ) %>%
  select(-prob.x, -prob.y, -pval.x, -pval.y)

Calculating the difference between probabilities tumor - skin

merged_data <- merged_data %>%
  mutate(prob.delta = prob.t - prob.s) %>%
  arrange(desc(abs(prob.delta)))

Count interactions for skin and tumor (actual numeric difference )

cellchat.t.sC_counts <- cellchat.t.sC %>%
  group_by(source, target) %>%
  summarise(count_t = n())
## `summarise()` has grouped output by 'source'. You can override using the
## `.groups` argument.
cellchat.s.sC_counts <- cellchat.s.sC %>%
  group_by(source, target) %>%
  summarise(count_s = n())
## `summarise()` has grouped output by 'source'. You can override using the
## `.groups` argument.
# Merge counts
merged_df.interactions <- merge(
  cellchat.t.sC_counts, 
  cellchat.s.sC_counts, 
  by=c("source", "target"), 
  all = TRUE)
# Replacing NA with 0 in case some interactions are not present in one of the data frames
merged_df.interactions[is.na(merged_df.interactions)] <- 0
# Calculate the difference in counts:
merged_df.interactions$interaction_difference <- 
  merged_df.interactions$count_t - merged_df.interactions$count_s

Heatmap based on counts difference

heatmap_plot <- ggplot(
  merged_df.interactions, 
  aes(
    x=target, 
    y=source, 
    fill=interaction_difference)
  ) + 
  geom_tile(color = "white", size = 0.1) +
  scale_fill_gradient2(name = "Interactions Difference", 
                       high = rgb(178/255, 24/255, 43/255), 
                       low = rgb(33/255, 102/255, 172/255)
                       ) + # Diverging color scale 
  labs(title = "Difference in Number of Interactions (Tumor vs Skin)", 
       x = "Target cells (receptor)", 
       y = "Source cells (ligand)", 
       fill = "Interactions Difference") +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1, size = 10),
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12),
    plot.title = element_text(size = 14, face = "bold"),
    legend.position = "right",
    legend.direction = "vertical",
    legend.title = element_text(size = 12),
    legend.text = element_text(size = 10)
) 

print(heatmap_plot)

ggsave("heatmap_based_on_counts_difference_without_naive_CD4.png", 
       plot = heatmap_plot,
       width = 10, 
       height = 8, 
       dpi = 300)

# Convert to plotly for interactivity
interactive_heatmap <- ggplotly(heatmap_plot)

# Print the interactive heatmap
interactive_heatmap
# Convert factors to characters to avoid conversion issues
merged_df.interactions$source <- as.character(merged_df.interactions$source)
merged_df.interactions$target <- as.character(merged_df.interactions$target)

# Create a new matrix with all zero values
interaction_matrix <- matrix(0, 
                             nrow = length(
                               unique(merged_df.interactions$source)
                               ), 
                             ncol = length(
                               unique(merged_df.interactions$target)
                               ),
                             dimnames = list(
                               unique(merged_df.interactions$source),
                               unique(merged_df.interactions$target)
                               )
                             )

# Fill the matrix with interaction_difference values
for(i in seq_len(nrow(merged_df.interactions))) {
  interaction_matrix [merged_df.interactions$source[i],
                      merged_df.interactions$target[i]] <- 
    merged_df.interactions$interaction_difference[i]
}

# Pheatmap
pheatmap_based_on_counts_difference <- pheatmap(
  interaction_matrix,
  color = colorRampPalette(c(rgb(33/255, 102/255, 172/255), 
                             "white", 
                             rgb(178/255, 24/255, 43/255)))(100),
         border_color = NA,
         treeheight_row = 50,
         treeheight_col = 50,
         legend = TRUE,
          main = "Difference in Number of Interactions (Tumor vs Skin)"
         )

print (pheatmap_based_on_counts_difference)

ggsave("pheatmap_based_on_counts_difference_without_CD4.png", 
       plot = pheatmap_based_on_counts_difference, 
       width = 10, 
       height = 8, 
       dpi = 300)

Number of interactions per source cell (ligand) in tumor and skin

# Count interactions per source for tumor data without T naive CD4
df.t <- merged_data %>%
  dplyr::as_tibble() %>% 
  dplyr::count(source) %>% 
  dplyr::rename(Number_of_Interactions = n)
df.t$Type <- "Tumor"

# Count interactions per source for skin data without T naive CD4
df.s <- merged_data %>%
  dplyr::as_tibble() %>% 
  dplyr::count(source) %>% 
  dplyr::rename(Number_of_Interactions = n)
# Making counts negative
df.s$Number_of_Interactions <- -df.s$Number_of_Interactions 
df.s$Type <- "Skin"

# Combine the two datasets
combined_data <- bind_rows(df.t, df.s)

# Plot tumor + skin without T naive CD4
combined_plot <- ggplot(
  combined_data, 
  aes(x = source, 
      y = Number_of_Interactions, 
      fill = Type)) +
  geom_bar(
    stat = "identity", 
    position = "stack") +
  labs(title = "Number of interactions per source cell without T naive CD4", 
       y = "Number of Interactions", 
       x = "Source Cell") +
  scale_fill_manual(values = c("Skin" = rgb(33/255, 102/255, 172/255), 
                               "Tumor" = rgb(178/255, 24/255, 43/255))) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

print(combined_plot)

ggsave("count_source_tumor_vs_skin_without_naive_CD4.png", 
       plot = combined_plot, 
       width = 10, 
       height = 8, 
       dpi = 300)

Number of interactions per source cell (ligand) in tumor - skin

# Compute interaction counts for each dataset, excluding T naive CD4
df.t <- cellchat.t %>%
  subsetCommunication(thresh = NA) %>%
  filter(source != naive_CD4_identifier & target != naive_CD4_identifier) %>% 
  dplyr::as_tibble() %>% 
  dplyr::count(source) %>% 
  dplyr::rename(Tumor_Interactions = n)
df.s <- cellchat.s %>% # no need to exclude, since in skin there is nothing 
  subsetCommunication(thresh = NA) %>% 
  dplyr::as_tibble() %>% 
  dplyr::count(source) %>% 
  dplyr::rename(Skin_Interactions = n)

# Merge datasets by the 'source' (27 levels - celltypes) column
combined_data.diff <- full_join(df.t, df.s, by = "source")

# Remove NA values because T naive CD4 in Skin_Interactions = NA
combined_data.diff$Tumor_Interactions[
  is.na(combined_data.diff$Tumor_Interactions)
  ] <- 0
combined_data.diff$Skin_Interactions[
  is.na(combined_data.diff$Skin_Interactions)
  ] <- 0

# Compute the difference for each source: skin - tumor
combined_data.diff$Interaction_Difference <- 
  combined_data.diff$Tumor_Interactions - combined_data.diff$Skin_Interactions

# Display the table (screenshot saved)
print(combined_data.diff, n = 27)# Display the table (screenshot saved)
## # A tibble: 27 × 4
##    source            Tumor_Interactions Skin_Interactions Interaction_Difference
##    <fct>                          <dbl>             <dbl>                  <dbl>
##  1 B cell                           363               456                    -93
##  2 Endothel                         884               638                    246
##  3 Endothel_vasc._31               1071               860                    211
##  4 Erythrocyte                       88                92                     -4
##  5 Fibroblast_18                   1152              1100                     52
##  6 Fibroblast_20                    993               813                    180
##  7 Fibroblast_25                    551               458                     93
##  8 Fibroblast_32                   1299              1002                    297
##  9 Fibroblast_36                   1116              1241                   -125
## 10 T gd                             260               300                    -40
## 11 Keratinocyte_26                  551               615                    -64
## 12 Mast_27                          154               127                     27
## 13 Monocyte                         451               352                     99
## 14 Monocyte_23                      276               175                    101
## 15 Neurons_47                        25               174                   -149
## 16 Neutrophil                       105               157                    -52
## 17 NK                               239               346                   -107
## 18 NK T like                        293               242                     51
## 19 Plasma_15                        301               329                    -28
## 20 Plasma_35                         62               165                   -103
## 21 Plasma_37                        284               313                    -29
## 22 Schwann_43                       813               803                     10
## 23 T cytotox. CD8                   266               329                    -63
## 24 T fh                             536               504                     32
## 25 T mem 1                          211               266                    -55
## 26 T mem 2                          250               309                    -59
## 27 T reg CD4                        230               289                    -59
# Plot tumor - skin with colors for positive and negative differences
difference_plot <- ggplot(
  combined_data.diff, 
  aes(
    x = source, 
    y = Interaction_Difference, 
    fill = Interaction_Difference > 0)) + # Moved inside aes()
  geom_bar(
    stat = "identity", 
    position = "dodge"
    ) +
  scale_fill_manual(
    values = c(
      "TRUE" = rgb(178/255, 24/255, 43/255), 
      "FALSE" = rgb(33/255, 102/255, 172/255)),
    labels = c(
      "TRUE" = "Tumor",
      "FALSE" = "Skin")
    ) +
  theme_minimal() +
  labs(title = "Difference in interactions per source cell (Tumor - Skin)", 
       y = "Difference in Interactions", 
       x = "Source Cell") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

difference_plot

ggsave("count_source_absolute_difference_tumor_vs_skin.png", 
       plot = difference_plot, 
       width = 10, 
       height = 8, 
       dpi = 300)

Scatter plot source

scatter_plot <- ggplot(
  combined_data.diff, 
  aes(x = Tumor_Interactions, 
      y = Skin_Interactions, 
      label = source)) +
  geom_point(
    aes(color = source), size = 3
    ) +
  geom_text(
    aes(label = source), size = 3
    ) +
  geom_smooth(
    method = "lm",
    se = TRUE
    ) +
  labs(
    title = "Number of Interactions per source Cell", 
    x = "Tumor Interactions", 
    y = "Skin Interactions"
    ) +
  theme(legend.position = "none")+
    theme_minimal() 

print(scatter_plot)
## `geom_smooth()` using formula = 'y ~ x'
## Warning: The following aesthetics were dropped during statistical transformation: label
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

ggsave("scatter_plot_source.png", 
       plot = scatter_plot, 
       width = 10, 
       height = 8, 
       dpi = 300)
## `geom_smooth()` using formula = 'y ~ x'
## Warning: The following aesthetics were dropped during statistical transformation: label
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

Number of interactions per target cell (receptor) in tumor and skin

df.t <- cellchat.t %>%
  subsetCommunication(thresh = NA) %>% 
  filter(source != naive_CD4_identifier & target != naive_CD4_identifier) %>% 
  dplyr::as_tibble() %>%
  dplyr::count(target) %>%
  dplyr::rename(Number_of_Interactions = n)

df.t$Type <- "Tumor"

df.s <- cellchat.s %>%
  subsetCommunication(thresh = NA) %>% 
  dplyr::as_tibble() %>% 
  dplyr::count(target) %>% 
  dplyr::rename(Number_of_Interactions = n)

# Making counts negative
df.s$Number_of_Interactions <- -df.s$Number_of_Interactions 
df.s$Type <- "Skin"

combined_data <- bind_rows(df.t, df.s)

# Plot tumor + skin
combined_plot <- ggplot(
  combined_data, 
  aes(
    x = target, 
    y = Number_of_Interactions, 
    fill = Type)
  ) +
  geom_bar(
    stat = "identity", 
    position = "stack"
    ) +
  labs(
    title = "Number of interactions per target cell", 
    y = "Number of Interactions", 
    x = "Target Cell"
    ) +
  scale_fill_manual(
    values = c(
      "Skin" = rgb(33/255, 102/255, 172/255), 
      "Tumor" = rgb(178/255, 24/255, 43/255)
      )
    ) +
    theme_minimal()  +
  theme(axis.text.x = element_text(
    angle = 90, 
    hjust = 1) # hjust = 1 to "press" names to plot
  )
print(combined_plot)

ggsave("count_target_tumor_vs_skin_without_naive_CD4.png", 
       plot = combined_plot, 
       width = 10, 
       height = 8, 
       dpi = 300)

Number of interactions per target cell (receptor) in tumor - skin

# Compute interaction counts for each dataset
df.t <- cellchat.t %>%
  subsetCommunication(thresh = NA) %>% 
  filter(source != naive_CD4_identifier & target != naive_CD4_identifier) %>% 
  dplyr::as_tibble() %>% 
  dplyr::count(target) %>% 
  dplyr::rename(Tumor_Interactions = n)
df.s <- cellchat.s %>% 
  subsetCommunication(thresh = NA) %>% 
  dplyr::as_tibble() %>% 
  dplyr::count(target) %>% 
  dplyr::rename(Skin_Interactions = n)

# Merge datasets by the 'target' (27 levels - celltypes) column
combined_data.diff <- full_join(
  df.t,
  df.s, 
  by = "target")

# Remove NA values because T naive CD4 in Skin_Interactions = NA
combined_data.diff$Tumor_Interactions[
  is.na(combined_data.diff$Tumor_Interactions)
  ] <- 0
combined_data.diff$Skin_Interactions[
  is.na(combined_data.diff$Skin_Interactions)
  ] <- 0

# Compute the difference for each target: tumor - skin
combined_data.diff$Interaction_Difference <- 
  combined_data.diff$Tumor_Interactions  - combined_data.diff$Skin_Interactions
print (combined_data.diff, n = 27) # Display the table (screenshot saved)
## # A tibble: 26 × 4
##    target            Tumor_Interactions Skin_Interactions Interaction_Difference
##    <fct>                          <dbl>             <dbl>                  <dbl>
##  1 B cell                           293               333                    -40
##  2 Endothel                         581               291                    290
##  3 Endothel_vasc._31                915               929                    -14
##  4 Fibroblast_18                    764               659                    105
##  5 Fibroblast_20                    561               428                    133
##  6 Fibroblast_25                    188               152                     36
##  7 Fibroblast_32                    852               575                    277
##  8 Fibroblast_36                    709               976                   -267
##  9 T gd                             324               505                   -181
## 10 Keratinocyte_26                  611               705                    -94
## 11 Mast_27                          300               183                    117
## 12 Monocyte                         827               569                    258
## 13 Monocyte_23                      193               196                     -3
## 14 Neurons_47                        25               162                   -137
## 15 Neutrophil                       275               257                     18
## 16 NK                               539               691                   -152
## 17 NK T like                        235               282                    -47
## 18 Plasma_15                        511               542                    -31
## 19 Plasma_35                        283               168                    115
## 20 Plasma_37                        492               535                    -43
## 21 Schwann_43                       686               595                     91
## 22 T cytotox. CD8                   596               588                      8
## 23 T fh                             748               867                   -119
## 24 T mem 1                          416               339                     77
## 25 T mem 2                          442               448                     -6
## 26 T reg CD4                        458               480                    -22
# Plot tumor - skin with colors for positive and negative differences
difference_plot <- ggplot(
  combined_data.diff, 
  aes(
    x = target, 
    y = Interaction_Difference, 
    fill = Interaction_Difference > 0)
  ) + # Moved inside aes()
  geom_bar(
    stat = "identity", 
    position = "dodge"
    ) +
  scale_fill_manual(
    values = c(
      "TRUE" = rgb(178/255, 24/255, 43/255), 
      "FALSE" = rgb(33/255, 102/255, 172/255)
      ),
                    labels = c(
                      "TRUE" = "Tumor",
                      "FALSE" = "Skin")
    ) +
  theme_minimal() +
  labs(title = "Difference in interactions per target cell (Tumor - Skin)", 
       y = "Difference in Interactions", 
       x = "Target Cell") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

difference_plot

ggsave("count_target_absolute_difference_tumor_vs_skin.png", 
       plot = difference_plot, 
       width = 10, 
       height = 8, 
       dpi = 300)

Scatter plot target

scatter_plot <- ggplot(combined_data.diff, 
                       aes(
                         x = Tumor_Interactions, 
                         y = Skin_Interactions, 
                         label = target)
                       ) + 
  geom_point(aes(color = target), size = 3) +
  geom_text(aes(label = target), size = 3) +
  geom_smooth(method = "lm",se = TRUE) +
  labs(
    title = "Number of Interactions per target Cell", 
       x = "Tumor Interactions", 
       y = "Skin Interactions"
    ) +
  theme(legend.position = "none")+
    theme_minimal() 

print(scatter_plot)
## `geom_smooth()` using formula = 'y ~ x'
## Warning: The following aesthetics were dropped during statistical transformation: label
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

ggsave("scatter_plot_target.png", 
       plot = scatter_plot, 
       width = 10, 
       height = 8, 
       dpi = 300)
## `geom_smooth()` using formula = 'y ~ x'
## Warning: The following aesthetics were dropped during statistical transformation: label
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

Plotting top 10 interactions with biggest differences in tumor - skin

# Combining data tumor and skin 
df.t <- cellchat.t %>%
  subsetCommunication(thresh = NA) %>% 
  filter(source != naive_CD4_identifier & target != naive_CD4_identifier) %>% 
  dplyr::as_tibble() %>% 
  dplyr::group_by(source, target) %>%
  dplyr::summarise(Tumor_Interactions = n())
## `summarise()` has grouped output by 'source'. You can override using the
## `.groups` argument.
df.s <- cellchat.s %>% 
  subsetCommunication(thresh = NA) %>% 
  dplyr::as_tibble() %>% 
  dplyr::group_by(source, target) %>% 
  dplyr::summarise(Skin_Interactions = n())
## `summarise()` has grouped output by 'source'. You can override using the
## `.groups` argument.
# Merge datasets by the 'source' and 'target'
combined_data.diff <- full_join(
  df.t, 
  df.s, 
  by = c("source", "target")
  )

# Replace NAs with 0
combined_data.diff$Tumor_Interactions[
  is.na(combined_data.diff$Tumor_Interactions)
  ] <- 0
combined_data.diff$Skin_Interactions[
  is.na(combined_data.diff$Skin_Interactions)
  ] <- 0

# Compute the difference for each source-target pair: skin - tumor
combined_data.diff$Interaction_Difference <- 
  combined_data.diff$Tumor_Interactions  - combined_data.diff$Skin_Interactions

# Filter to get the top 10 interactions by absolute difference
top_10_diff <- combined_data.diff %>%
  dplyr::ungroup() %>% # Calculate differences without grouping by 'source'
  dplyr::arrange(-abs(Interaction_Difference)) %>%
  dplyr::slice_head(n = 10)

print(top_10_diff)
## # A tibble: 10 × 5
##    source     target Tumor_Interactions Skin_Interactions Interaction_Difference
##    <fct>      <fct>               <dbl>             <dbl>                  <dbl>
##  1 Fibroblas… Fibro…                 88                47                     41
##  2 Fibroblas… Fibro…                 71               111                    -40
##  3 Fibroblas… Endot…                 59                21                     38
##  4 Endothel_… Fibro…                 80                43                     37
##  5 Fibroblas… Monoc…                 79                43                     36
##  6 Fibroblas… Endot…                 49                16                     33
##  7 Fibroblas… Fibro…                 73                42                     31
##  8 Fibroblas… Endot…                 53                23                     30
##  9 Fibroblas… Fibro…                 63                93                    -30
## 10 Endothel   Endot…                 44                15                     29
# paired t-test
result <- t.test(
  top_10_diff$Tumor_Interactions, 
  top_10_diff$Skin_Interactions, 
  paired=TRUE)
print(result)
## 
##  Paired t-test
## 
## data:  top_10_diff$Tumor_Interactions and top_10_diff$Skin_Interactions
## t = 2.1911, df = 9, p-value = 0.05615
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -0.6652445 41.6652445
## sample estimates:
## mean difference 
##            20.5
###p-value = 0.004082 => statistically significant difference between "Tumor_Interactions" and "Skin_Interactions"

# Plot top 10 interactions with biggest differences 
difference_plot <- ggplot(
  top_10_diff, 
  aes(
    x = paste(source, target, sep = "-"), 
    y = Interaction_Difference,
    fill = Interaction_Difference > 0)
  ) +
  geom_bar(
    stat = "identity",
    position = "dodge"
    ) +
  scale_fill_manual(
    values = c(
      "TRUE" = rgb(178/255, 24/255, 43/255),
      "FALSE" = rgb(33/255, 102/255, 172/255)
      ),
                    labels = c(
                      "TRUE" = "Tumor",
                      "FALSE" = "Skin")
    ) +
  theme_minimal() +
  labs(
    title = "Top 10 Differences in Interactions (Tumor - Skin)", 
    y = "Difference in Interactions", 
    x = "Interaction (Source-target)") +
  theme(axis.text.x = element_text(
    angle = 90, 
    hjust = 1)
    )

print(difference_plot)

ggsave("Top_10_Differences_in_Interactions.png", 
       plot = difference_plot, 
       width = 10, 
       height = 8, 
       dpi = 300)

Function to process interactions between sorce and target celltypes

plot_interaction <- function(
    df, 
    source_value, 
    target_value) {
  df_filtered <- df %>%
    filter(source == source_value & target == target_value) %>%
    slice_max(
      order_by = abs(prob.delta), 
      n = 40) %>%
    select(-c(pval.t, pval.s))

  # Create a label from the source and target values
  interaction_label <- paste(
    source_value, 
    target_value, 
    sep = " to ")

  # Pivot and plot using the new label
  df_filtered %>%
    pivot_longer(cols = c("prob.s", "prob.t"), 
                 names_to = "variable", 
                 values_to = "value") %>%
    ggplot(aes(
      x = interaction_name_2, 
      y = value, 
      fill = variable)
      ) +
    geom_col(position = "dodge") +
    scale_fill_manual(
      values = c(
      "prob.s" = rgb(33/255, 102/255, 172/255), 
      "prob.t" = rgb(178/255, 24/255, 43/255)
      )
      ) +
    labs(
      x = interaction_label, 
      y = "Probability Delta", 
      fill = "Probability"
      ) +
    theme(axis.text.x = element_text(
      angle = 90, 
      hjust = 1, 
      vjust = 0.5)
      )
}

Plotting top 10 interactions based on abs(interactions difference)

# Define the pairs of interactions
interaction_pairs <- data.frame(
  source = c("Fibroblast_32", "Fibroblast_36", "Fibroblast_32", 
             "Endothel_vasc._31", "Fibroblast_32", "Fibroblast_20", 
             "Fibroblast_32", "Fibroblast_18", "Fibroblast_18", "Endothel"),
  target = c("Fibroblast_32", "Fibroblast_36", "Endothel", "Fibroblast_32",
             "Monocyte", "Endothel", "Fibroblast_20", "Endothel",
             "Fibroblast_36", "Endothel")
)

# Loop over the defined interaction pairs
for (i in 1:nrow(interaction_pairs)) {
  current_source <- interaction_pairs$source[i]
  current_target <- interaction_pairs$target[i]

  p <- plot_interaction(
    merged_data, 
    current_source, 
    current_target
    ) +
    theme_minimal() +
    theme(
      axis.text.x = element_text(
        angle = 90, 
        vjust = 0.5, 
        hjust = 1)
      )
  
    print(p)

# Save the plot
  file_name <- paste0("interaction",
                      "_", 
                      current_source, 
                      "_", 
                      current_target, 
                      ".pdf")
ggsave(file_name,
       plot = p,
       width = 18,
       height = 10,
       dpi = 300,
       path = "/Users/juliat/Desktop/bachelor/Final thesis/")
}

Sorting interactions in tumor based on pval and prob

# Identifying the top interactions based on the p-value (interactions with pval == 0)
# Group by interaction_name, then filter where pval in the group are 0
interactions_pval_zero.t <- cellchat.t.sC %>%
  group_by(interaction_name) %>%
  filter(pval == 0)

# Calculate the number of interactions to select for the top 1%
top_1_percent_count <- ceiling(nrow(interactions_pval_zero.t) * 0.01) 
# Use ceiling() to round up

# Create a new dataframe sorted by prob and select top 1%
interactions_sorted_prob.t <- interactions_pval_zero.t %>%
  ungroup() %>% # Ungroup to ensure slice_max works as expected
  slice_max(
    order_by = prob,
    n = top_1_percent_count
    )
  
# all interactions summarised, so each interaction = row
# 'source' and 'target' are discrete factors, and 'ligand' and 'receptor' are characters
Top_1_Interactions_in_Tumor <- ggplot(
  interactions_sorted_prob.t, 
  aes(
    x = source, 
    y = target, 
    label = interaction_name)
  ) +
  geom_tile(
    aes(fill = interaction_name), 
    colour = "white"
    ) +
  labs(
    title = "Top 1% Interactions in Tumor", 
    x = "Source", 
    y = "Target", 
    fill = "Interactions"
    ) +
  theme_minimal() + #white background 
  theme(
    axis.text.x = element_text(
      angle = 90,
      hjust = 1
      )
  )

print(Top_1_Interactions_in_Tumor)

ggsave("Top_1%_Interactions_in_Tumor.png",
       plot = Top_1_Interactions_in_Tumor, 
       width = 10, 
       height = 8,
       dpi = 300)

# Retrieve the full data for these top interactions
details_top_interactions_t <- cellchat.t.sC %>%
  filter(interaction_name %in% interactions_sorted_prob.t$interaction_name)
#  interactions are NOT summarised, so each interaction = multiple rows
# 'source' and 'target' are discrete factors, and 'ligand' and 'receptor' are characters
Top_1_Interactions_in_Tumor_full <- ggplot(
  details_top_interactions_t, 
  aes(
    x = source, 
    y = target, 
    label = interaction_name)
  ) +
  geom_tile(
    aes(fill = interaction_name),
    colour = "white"
    ) +
  labs(
    title = "Top 1% Interactions in Tumor", 
    x = "Source", 
    y = "Target", 
    fill = "Interactions") +
  theme_minimal() + #white background 
  theme(
    axis.text.x = element_text(angle = 90, hjust = 1)
  )

print(Top_1_Interactions_in_Tumor_full)

ggsave("Top_1%_Interactions_in_Tumor_full.png", 
       plot = Top_1_Interactions_in_Tumor_full, 
       width = 10,
       height = 8,
       dpi = 300)

Sorting interactions in skin based on pval and prob

# Identifying the top interactions based on the p-value (interactions with pval == 0)
# Group by interaction_name, then filter where pval in the group are 0
interactions_pval_zero.s <- cellchat.s.sC %>%
  group_by(interaction_name) %>%
  filter(pval == 0)
  
# Calculate the number of interactions to select for the top 1%
top_1_percent_count <- ceiling(
  nrow(interactions_pval_zero.s) * 0.01
  ) # Use ceiling to round up
# Create a new dataframe sorted by prob and select top 1%
interactions_sorted_prob.s <- interactions_pval_zero.s %>%
  ungroup() %>% # Ungroup to ensure slice_max works as expected
  slice_max(
    order_by = prob, 
    n = top_1_percent_count
    )
  
# all interactions summarised, so each interaction = row
# 'source' and 'target' are discrete factors, and 'ligand' and 'receptor' are characters
Top_1_Interactions_in_Skin <- ggplot(
  interactions_sorted_prob.s, 
  aes(
    x = source, 
    y = target, 
    label = interaction_name)
  ) +
  geom_tile(
    aes(fill = interaction_name), 
    colour = "white") +
  labs(
    title = "Top 1% Interactions in Skin", 
    x = "Source", 
    y = "Target", 
    fill = "Interactions"
    ) +
  theme_minimal() + #white background 
  theme(
    axis.text.x = element_text(angle = 90, hjust = 1)
  )

print(Top_1_Interactions_in_Skin)

ggsave("Top_1%_Interactions_in_Skin.png", 
       plot = Top_1_Interactions_in_Skin, 
       width = 10, 
       height = 8, 
       dpi = 300)
  
# Retrieve the full data for these top interactions
details_top_interactions_s <- cellchat.s.sC %>%
  filter(interaction_name %in% interactions_sorted_prob.s$interaction_name)
#  interactions are NOT summarised, so each interaction = multiple rows
# 'source' and 'target' are discrete factors, and 'ligand' and 'receptor' are characters
Top_1_Interactions_in_Skin_full <- ggplot(
  details_top_interactions_s, 
  aes(x = source, 
      y = target, 
      label = interaction_name)
  ) +
  geom_tile(
    aes(fill = interaction_name),
    colour = "white"
    ) +
  labs(
    title = "Top 1% Interactions in Skin", 
    x = "Source", 
    y = "Target", 
    fill = "Interactions"
    ) +
  theme_minimal() + #white background 
  theme(
    axis.text.x = element_text(
      angle = 90, 
      hjust = 1
      )
  )

print(Top_1_Interactions_in_Skin_full)

ggsave("Top_1%_Interactions_in_Skin_full.png", 
       plot = Top_1_Interactions_in_Skin_full, 
       width = 10,
       height = 8, 
       dpi = 300)

Top 100 Interactions with Biggest Difference in Probability Tumor

# Filtering by pval == 0 and abs(prob.delta)
merged_common_data <- merged_data %>%
  filter(pval.t == 0 & pval.s == 0) %>%
  mutate(
    more_common_in = ifelse(
      prob.delta > 0,
      "Tumor",
      "Skin"
      )
  )%>%
  slice_max(
    order_by = abs(prob.delta),
    n = 100)

# Plotting
Top_100_Interactions_with_Biggest_Difference_in_Probability <- ggplot(
  merged_common_data, 
  aes(
    x = source, 
    y = target)
  ) +
  geom_tile(
    aes(fill = more_common_in), 
    colour = "white"
    ) +
  geom_text(
    aes(label = interaction_name),
    size = 3, 
    check_overlap = TRUE,
    vjust = "top"
    ) + # Add interaction names
  scale_fill_manual(
    values = c(
    "Tumor" = rgb(178/255, 24/255, 43/255), 
    "Skin" = rgb(33/255, 102/255, 172/255)
    )
    ) + # Define custom colors for tumor and skin
  labs(
    title = "Top 100 Interactions with Biggest Difference in Probability (Tumor vs. Skin)", 
    x = "Source", 
    y = "Target", 
    fill = "More Common In") +
  theme_minimal() +
  theme(
    axis.text.x = element_text(
      angle = 90, 
      hjust = 1
      ),
    strip.background = element_blank(),
    strip.text = element_text(
      size = 12, 
      face = "bold"
      )
  )
print(Top_100_Interactions_with_Biggest_Difference_in_Probability)

ggsave("Top_100_Interactions_with_Biggest_Difference_in_Probability.png",
       plot = Top_100_Interactions_with_Biggest_Difference_in_Probability, 
       width = 10, 
       height = 8, 
       dpi = 300)

Interaction based on cell types

# Now, let's loop over these top 10 interactions and create the desired plots.
for (i in 1:nrow(top_10_diff)) {
  current_source <- top_10_diff$source[i]
  current_target <- top_10_diff$target[i]

  # Filter the merged_data for the current pair.
  current_data <- merged_data %>%
    filter(source == current_source, 
           target == current_target)

  # Plot
  p <- ggplot(
    current_data, 
    aes(
      x = ligand, 
      y = receptor, 
      fill = prob.delta)
    ) +
    geom_tile() +
    scale_fill_gradient2(
      low = rgb(33/255, 102/255, 172/255), 
      high = rgb(178/255, 24/255, 43/255), 
      mid = "grey", 
      midpoint = 0,
      limits = c(min(current_data$prob.delta, na.rm = TRUE), 
                 max(current_data$prob.delta, na.rm = TRUE)),
      name = "Prob Delta") +
    labs(title = paste("Ligand-Receptor Interactions for",
                       current_source,
                       "to",
                       current_target),
         x = "Ligand",
         y = "Receptor"
         ) +
    theme_minimal() +
    theme(axis.text.x = element_text(
      angle = 90, 
      vjust = 0.5
      ),
          axis.text.y = element_text(hjust = 1))
   
  print(p)

  # Save the plot
  file_name <- paste0("/Users/juliat/Desktop/bachelor/Final thesis/",
                      current_source,
                      "_to_",
                      current_target, 
                      ".pdf"
                      )
  ggsave(
    file_name,
    plot = p,
    width = 10,
    height = 10
    )
}

Violing plots

CLEC.t <- plotGeneExpression(cellchat.t, signaling = c("CLEC"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(CLEC.t)

CLEC.s <- plotGeneExpression(cellchat.s, signaling = c("CLEC"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(CLEC.s)

CDH.t <- plotGeneExpression(cellchat.t, signaling = c("CDH"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(CDH.t)

CDH.s <- plotGeneExpression(cellchat.s, signaling = c("CDH"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(CDH.s)

COLLAGEN.t <- plotGeneExpression(cellchat.t, signaling = c("COLLAGEN"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(COLLAGEN.t)

COLLAGEN.s <- plotGeneExpression(cellchat.s, signaling = c("COLLAGEN"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(COLLAGEN.s)

COMPLEMENT.t <- plotGeneExpression(cellchat.t, signaling = c("COMPLEMENT"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(COMPLEMENT.t)

COMPLEMENT.s <- plotGeneExpression(cellchat.s, signaling = c("COMPLEMENT"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(COMPLEMENT.s)

CXCL.t <- plotGeneExpression(cellchat.t, signaling = c("CXCL"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(CXCL.t)

CXCL.s <- plotGeneExpression(cellchat.s, signaling = c("CXCL"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(CXCL.s)

LAMININ.t <- plotGeneExpression(cellchat.t, signaling = c("LAMININ"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(LAMININ.t)

LAMININ.s <- plotGeneExpression(cellchat.s, signaling = c("LAMININ"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(LAMININ.s)

GALECTIN.t <- plotGeneExpression(cellchat.t, signaling = c("GALECTIN"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(GALECTIN.t)

GALECTIN.s <- plotGeneExpression(cellchat.s, signaling = c("GALECTIN"))
## There is no significant communication of GALECTIN
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(GALECTIN.s)

MIF.t <- plotGeneExpression(cellchat.t, signaling = c("MIF"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(MIF.t)

MIF.s <- plotGeneExpression(cellchat.s, signaling = c("MIF"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(MIF.s)

SEMA3.t <- plotGeneExpression(cellchat.t, signaling = c("SEMA3"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(SEMA3.t)

SEMA3.s <- plotGeneExpression(cellchat.s, signaling = c("SEMA3"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(SEMA3.s)

VISFATIN.t <- plotGeneExpression(cellchat.t, signaling = c("VISFATIN"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(VISFATIN.t)

VISFATIN.s <- plotGeneExpression(cellchat.s, signaling = c("VISFATIN"))
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
## Scale for y is already present.
## Adding another scale for y, which will replace the existing scale.
plot(VISFATIN.s)